/*
 * @Author: 13177709051 3506463075@qq.com
 * @Date: 2024-10-29 20:08:40
 * @LastEditors: 13177709051 3506463075@qq.com
 * @LastEditTime: 2024-10-29 23:45:29
 * @FilePath: /linux26/testThread.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
// 功能：创建一个新的线程
// 原型
// int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *
// (*start_routine)(void*), void *arg);
// 参数
// thread:返回线程ID
// attr:设置线程的属性，attr为NULL表示使用默认属性
// start_routine:是个函数地址，线程启动后要执行的函数
// arg:传给线程启动函数的参数
// 返回值：成功返回0；失败返回错误码


#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdbool.h>
#include <unistd.h>

void *thread_run(void *arg)
{
    pthread_detach(pthread_self());
    printf("%s\n", (char*)arg);
    return NULL;
}

int main()
{
    pthread_t tid;
    if(pthread_create(&tid, NULL, thread_run, (void*)"thread1 run...") != 0)
    {
        printf("create thread error\n");
        return 1;
    }
    int ret = 0;

    sleep(1); //很重要, 要让线程先分离, 在等待
    if(pthread_join(tid, NULL) == 0)
    {
        printf("pthread wait success\n");
        ret = 0;
    }
    else 
    {
        printf("pthread wait failed\n");
        ret = 1;
    }
    return ret;
}


// void *thread1(void *arg)
// {
//     printf("thread 1 returning ...\n");
//     int *p = (int*)malloc(sizeof(int));
//     *p = 1;
//     return (void *)p;
// }

// void *thread2(void *arg)
// {
//     printf("thread 2 returning ...\n");
//     int *p = (int*)malloc(sizeof(int));
//     *p = 2;
//     pthread_exit((void *)p);
// }

// void *thread3(void *arg)
// {
//     while(1)
//     {
//         printf("thread 3 is running ...\n");
//         sleep(1);
//     }
//     return NULL;
// }

// int main()
// {
//     pthread_t tid;
//     void *ret;

//     //thread 1 return 
//     pthread_create(&tid, NULL, thread1, NULL);
//     pthread_join(tid, &ret);
//     printf("thread return , thread id %X, return code:%d\n", tid, *(int*)ret);
//     free(ret);

//     //thread 2 exit
//     pthread_create(&tid, NULL, thread2, NULL);
//     pthread_join(tid, &ret);
//     printf("thread return , thread id %X , return code : %d\n", tid, *(int*)ret);
//     free(ret);

//     // thread 3 cancel by other
//     pthread_create(&tid, NULL, thread3, NULL);
//     sleep(3);
//     pthread_cancel(tid);
//     pthread_join(tid, &ret);
//     if(ret == PTHREAD_CANCELED)
//         printf("thread return , thread id %X, return code : PTHREAD_CANCELED\n", tid);
//     else
//         printf("thread return , thread id %X , return code : NULL\n", tid);
// }

// void *gettid(void *arg)
// {
//     //tid1,2,3,4 线程
//     // 将 arg 转换为字符串并打印
//     const char *thread_name = (const char *)arg;
//     while (true)
//     {
//         printf("%s: Thread ID : %lx\n", thread_name, (unsigned long)pthread_self());
//         // if(thread_name == "Thread 1") pthread_exit(NULL);
//         // else if(thread_name == "Thread 2") pthread_exit(NULL);
//         // else if(thread_name == "Thread 3") pthread_exit(NULL);
//         // else pthread_exit(NULL);
//         sleep(1);
//     }
// }

// int main()
// {
//     pthread_t tid1;
//     pthread_t tid2;
//     pthread_t tid3;
//     pthread_t tid4;

//     pthread_create(&tid1, NULL, gettid, (void *)"Thread 1");
//     pthread_create(&tid2, NULL, gettid, (void *)"Thread 2");
//     pthread_create(&tid3, NULL, gettid, (void *)"Thread 3");
//     pthread_create(&tid4, NULL, gettid, (void *)"Thread 4");

//     sleep(5);
//     pthread_cancel(tid1);
//     pthread_cancel(tid2);
//     pthread_cancel(tid3);
//     pthread_cancel(tid4);


//     // 主线程 ID
//     while (true)
//     {
//         printf("Main thread ID : %lx\n", (unsigned long)pthread_self());
//         sleep(1);
//     }
//     return 0;
// }

// void* rout(void *arg)
// {
//     int i;
//     for(; ; )
//     {
//         printf("I am thread 1\n");
//         sleep(1);
//     }
// }

// int main()
// {
//     pthread_t tid;
//     int ret;
//     if((ret = pthread_create(&tid, NULL, rout, NULL)) != 0)
//     {
//         fprintf(stderr, "pthread_create : %s\n", strerror(ret));
//         exit(EXIT_FAILURE);
//     }

//     int i;
//     for(; ; )
//     {
//         printf("I am main thread\n");
//         sleep(1);
//     }
// }